﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Net.Mail;

namespace ControlAcceso.Dominio
{
    public class Cliente : IEquatable<Cliente>
    {
        protected string nombres;
        protected string apellido;
        protected int documento;
        protected string direccion;
        protected string telefono;
        protected MailAddress email;
        protected string informacionAdicional;


        public Cliente(string nombres, string apellido, int documento, string direccion, string telefono, string email, string infoAdicional)
        {
            this.nombres = nombres;
            this.apellido = apellido;
            this.documento = documento;
            this.direccion = direccion;
            this.telefono = telefono;
            this.email = Cliente.crearMailAddress(email);
            this.informacionAdicional = infoAdicional;

            validateCreation();
        }

        private static MailAddress crearMailAddress(string email)
        {
            try
            {
                return new MailAddress(email);
            }
            catch (Exception)
            {
                throw new FormatException("El email no es válido");
            }
        }

        private void validateCreation()
        {
            if (this.nombres == null || this.nombres.Length == 0) throw new FormatException("Debe ingresar al menos un nombre");
            if (this.apellido == null || this.apellido.Length == 0) throw new FormatException("Debe ingresar el apellido");
            if (this.documento == 0) throw new FormatException("Debe ingresar el documento");
            if (this.direccion == null || this.direccion.Length == 0) throw new FormatException("Debe ingresar la direccion");
            if (this.telefono == null || this.telefono.Length == 0) throw new FormatException("Debe ingresar un teléfono");
            else
            {
                if (!Regex.IsMatch(this.telefono, "^(\\([0-9]{3,5}\\))?\\s?[0-9]{6,9}$")) throw new FormatException("El formato del teléfono debe ser (0351...) 123456.., donde la característica es opcional");
            }
            if (this.direccion != null && this.direccion.Length > 0)
            {
                Regex.Replace(this.direccion, "[^0-9a-zA-Z\\s]+", " ");
            }
        }

        public string Nombres
        {
            get { return nombres; }
            set { nombres = value; }
        }

        public string Apellido
        {
            get { return this.apellido; }
            set { this.apellido = value; }
        }

        public int Documento
        {
            get { return this.documento; }
            set { this.documento = value; }
        }

        public string Telefono
        {
            get { return this.telefono; }
            set { this.telefono = value; }
        }

        public string Direccion
        {
            get { return this.direccion; }
            set { this.direccion = value; }
        }

        public string Email
        {
            get { return this.email.Address; }
            set { this.email = Cliente.crearMailAddress(value); }
        }

        public string InformacionAdicional
        {
            get { return this.informacionAdicional; }
            set { this.informacionAdicional = value; }
        }

        public bool Equals(Cliente other)
        {
            return this.documento.Equals(other.documento);
        }
    }
}
